今天學的東西,需要有OOP的觀念,也就是物件導向的觀念,由於之前自己學過JS後,以為物件都是可以直接創建。但事實並非如此,而是需要搭配class(類)來創建我們的物件。
class好比設計藍圖,而我們可以利用這個藍圖,去創建物件。如class Car => 創建 obj Audi、obj Toyota、一些method...
class命名不可為數字開頭,大小寫沒有分
,所以不能在宣告一個class dog。
而此處我們宣告變數,型態有public為開放,內外都可呼叫
,如果沒有特別加,預設就是public
。private
為私有(一般會在前面加上底線
),只能在當前類的內部呼叫
,而其實還有一個叫做protected受保護
,跟private一樣只能在類的內部呼叫
、取用,而之後會操作並詳解。而通常不會在class宣告變數的地方賦予初始值,除非所有實體化的物件需要某個屬性是統一的值
,大多都是使用private或protected來增加對屬性的控制性,一般都是透過方法來實現對屬性的修改。
class Dog
{
private $_breed;
private $_age;
private $_gender;
}
建構式
(__construct()
),也就是在new完物件後,會執行一次,也就是初始化的概念。
此處我們利用建構式,獲取物件所傳來的參數,並賦予給我們宣告好的變數。
public function __construct($objBreed, $objAge, $objGender)
{
// 利用$this可以指向obj本體
$this->_breed = $objBreed;
$this->_age = $objAge;
$this->_gender = $objGender;
$this->display();
}
而我們在class外面,利用new去創建一個實體化物件。
// $bogi = new Dog;
// 如果在建構式需要傳入參數,就須加入()。
$bogi = new Dog("doge", 20, "male");
var_dump($bogi);
// object(Dog)#1 (3) { ["_breed":"Dog":private]=> string(4) "doge" ["_age":"Dog":private]=> int(20) ["_gender":"Dog":private]=> string(6) "female" }
// 這個Dog物件有3個屬性 ["對應屬性名及詳情"] => 屬性值的類型(長度) "屬性值
而後我們在class內寫了一些方法,display在初始化的時候,用來呼叫我們的方法及一些數據等等。
在class外要指向對應屬性需要,$物件名->屬性名如:$bogi-> _ breed(如果為變數為private則無法從外面指向),而在class內僅需$this即可指向如:$this-> _ breed 。
public function display()
{
// return $age; //這樣寫$age只是純變數,與我們所設置的public $age(物件中的屬性)無相關
// 利用$this可以指向obj本體($bogi),藉此來指向物件下的屬性
// return $this->_gender;
echo $this->sleep();
echo "<br/>";
echo $this->showBreed();
echo "<br/>";
echo $this->showAge();
echo "<br/>";
echo $this->showGender();
echo "<br/>";
$this->changeGender('female');
echo $this->showGender();
echo "<hr/>";
$this->removeAge();
}
public function showBreed()
{
echo $this->_breed;
}
public function showAge()
{
echo $this->_age;
}
public function showGender()
{
echo $this->_gender;
}
我們可以在函數中去更改屬性值,觀察刪除後的物件,我們在此處在創建一個物件bogi2去做比較,可發現age已被刪除,很少用到刪除及新增,大多使用修改讀取居多。
// 更改性別
private function changeGender($gender)
{
// 修改屬性
$this->_gender = $gender;
}
// 刪除年齡
private function removeAge()
{
// 刪除屬性
unset($this->_age);
}
$bogi2 = new Dog("shiba", "87", "female");
var_dump($bogi2);
echo "<hr>";
CLASS 可以獲取類別名稱,而通常以const來設置常數,與js相同,但如果我們想獲取常數的話,無法用一般的方法進行獲取($jojo->PI),因為它會去物件下找為$PI的常數,但我們並沒有,之後會講解如何獲取常數的部分。
class Human
{
public function display()
{
echo __CLASS__;
}
// 設置常數
const PI = 3.14;
}
$jojo = new Human();
// 想要讀取常數的話,這樣會獲取不到,因為它會去找為$PI的常數,但我們並沒有。
$jojo->PI;
$jojo->display(); //Human
而這是在網上抓的一個基本php執行的流程。